package com.atguigu.user.service.impl;


import com.atguigu.constants.UserConstants;
import com.atguigu.param.UserCheckParam;
import com.atguigu.param.UserLoginParam;
import com.atguigu.pojo.User;
import com.atguigu.user.mapper.UserMapper;
import com.atguigu.user.service.UserService;
import com.atguigu.utils.MD5Util;
import com.atguigu.utils.R;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @Name: MyComputer
 * @ClassName UserServiceImpl
 * @Description:
 * @date 2023/5/18 8:52
 */
@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    /**
     * 检查账号校验是否可用
     *
     * @param userCheckParam
     * @return 返回检查结果 001 004
     */
    @Override
    public R check(UserCheckParam userCheckParam) {
        //参数封装
        LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<>();
        userLambdaQueryWrapper.eq(User::getUserName, userCheckParam.getUserName());
        //数据库查询
        Long count = userMapper.selectCount(userLambdaQueryWrapper);
        //查询结果处理
        if (count == 0) {
            //数据库中不存在
            return R.ok("结果不存在，可以使用");
        }

        return R.fail("结果存在，不可使用");
    }

    /**
     * 注册业务
     * 1.检查账号是否存在
     * 2.密码加密 加盐处理
     * 3.插入数据库
     * 4.返回封装结果
     *
     * @param user 参数已经校验 但是密码是明文
     * @return
     */
    @Override
    public R register(User user) {

//   1. 检查账号是否存在
        //参数封装
        LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<>();
        userLambdaQueryWrapper.eq(User::getUserId, user.getUserName());
        //数据库查询
        Long count = userMapper.selectCount(userLambdaQueryWrapper);
        //查询结果处理
        if (count > 0) {
            //数据库存在
            return R.ok("账号已经存在，不可注册");
        }
//   2. 密码加密 加盐处理
        /**
         * MD5 不可逆加密
         * MD5 可以暴力破解，使用加盐处理提高安全性
         */
        String encode = MD5Util.encode(user.getPassword() + UserConstants.USER_SALT);
        user.setPassword(encode);
//   3. 插入数据库
        int insert = userMapper.insert(user);
//   4. 返回封装结果
        if (insert == 0){
            return R.fail("注册失败");
        }
        return R.ok("注册成功");
    }

    /**
     * d登录业务
     *  1. 密码的加密
     *  2. 账号与密码 与 数据库中的对比
     *  3. 判断返回结果
     * @param userLoginParam 账号与密码 已经校验 但是密码是明文
     * @return
     */
    @Override
    public R login(UserLoginParam userLoginParam) {

// *  1. 密码的加密
        String newPs = MD5Util.encode(userLoginParam.getPassword() + UserConstants.USER_SALT);
// *  2. 账号与密码 与 数据库中的对比
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(User::getUserName,userLoginParam.getUserName());
        queryWrapper.eq(User::getPassword,newPs);

        User user = userMapper.selectOne(queryWrapper);
// *  3. 判断返回结果
        if (user == null){
            return R.fail("账号或密码错误");
        }

        user.setPassword(null); //不返回password属性
        return R.ok("登录成功",user);
    }

}
